import api from '@/api'
import configs from '@/config'
import SDK from '@/node_modules/easemob-websdk/uniApp/Easemob-chat'
import config from '@/config/index'
import { useUserStore } from '@/store/useUserStore'
import { loginStatus } from '@/hooks/useLogin';
export class ImServerClass {
	constructor() {
		this.create()
	}
	tos = {
		username: "",
		password: "",
	}
	froms = {
		username: "",
		password: "",
	}
	instance : any = null
	create() {
		if (this.instance == null) {
			const WebIM = SDK;
			const conn = new WebIM.connection({
				appKey: config.imAppKey,
				url: config.imUrl, // websocket 连接地址
				apiUrl: config.imApiUrl, // REST API 连接地址
				useOwnUploadFun: true, // 是否使用自己的上传方式（如将图片文件等上传到自己的服务器，构建消息时只传 URL）
				delivery: true
			});
			this.instance = conn
		}

	}
	login() {
		if (useUserStore().userInfo) {
			return this.instance.open({
				user: "xjs_" + useUserStore().userInfo.id,
				pwd: "xjs_" + useUserStore().userInfo.id,
			}).catch(err => {
				this.onError(err)
			})
		}
	}
	loginOut() {
		this.instance.close();
	}
	readMsg(userId) {
		let option = {
			chatType: "singleChat", // 会话类型，设置为单聊。
			type: "channel", // 消息类型。
			to: userId, // 接收消息对象的用户 ID。
		};
		let msg = SDK.message.create(option);
		this.instance.send(msg)
	}
	// 发送文本消息。
	sendText(callback : Function, params) {
		let { to, msg } = params
		let ext = this.setMessageExt()
		let option = {
			type: "txt",
			msg: msg,
			to: to,
			chatType: "singleChat",
			ext: ext,
		};
		// 创建文本消息。
		let message = SDK.message.create(option);
		this.instance.send(message).then((res) => {
			callback && callback(res)
		}).catch((e) => {
			console.log("Send message fail文字", e);
			this.onError(e)
		});
	}
	//发送图片
	sendImage(callback : Function, params) {
		let { to } = params
		uni.chooseImage({
			count: 1,
			sizeType: ["original", "compressed"],
			sourceType: ["album"],
			success: (res) => {
				console.log(res)
				if (res.tempFiles[0].size >= (10485760 / 2)) {
					uni.showToast({
						icon: 'none',
						title: '图片大小不能超过5M~'
					})
					return
				}
				let tempFilePaths = res.tempFilePaths;
				let token = this.instance.context.accessToken;
				uni.getImageInfo({
					src: res.tempFilePaths[0],
					success: (imgres) => {
						console.log(imgres)
						let allowType = {
							jpg: true,
							gif: true,
							png: true,
							bmp: true,
						};
						let str = config.imAppKey.split("#");
						let width = imgres.width;
						let height = imgres.height;
						let index = imgres.path.lastIndexOf(".");
						let filetype = (~index && imgres.path.slice(index + 1)) || "";
						let domain = config.imApiUrl + "/";
						uni.uploadFile({
							url: domain + str[0] + "/" + str[1] + "/chatfiles",
							filePath: tempFilePaths[0],
							name: "file",
							header: {
								Authorization: "Bearer " + token
							},
							success: (res) => {
								console.log(res)
								let ext = this.setMessageExt()
								var data = res.data;
								var dataObj = JSON.parse(data);
								var option = {
									type: "img",
									chatType: "singleChat",
									width: width,
									height: height,
									url: dataObj.uri + "/" + dataObj.entities[0].uuid,
									// 消息接收方：单聊为对方用户 ID，群聊和聊天室分别为群组 ID 和聊天室 ID。
									to: to,
									ext: ext,
								};
								let msg = SDK.message.create(option);
								// 调用 `send` 方法发送该图片消息。
								this.instance
									.send(msg)
									.then((res) => {
										// 图片消息成功发送。
										callback && callback(res)
									})
									.catch((e) => {
										// 图片消息发送失败。
										console.log("Fail图片", e);
										this.onError(e)
									});
							}
						})
					}
				})
			},
		});
	}
	//发送视频
	sendVideo(callback : Function, params) {
		let { to } = params
		uni.chooseVideo({
			sourceType: ["album", "camera"],
			success: (res) => {
				console.log(res)
				if (res.size >= 10485760) {
					uni.showToast({
						icon: 'none',
						title: '视频大小不能超过10M~'
					})
					return
				}
				uni.showLoading({
					mask: true,
					title: '上传中'
				})
				let tempFilePaths = res.tempFilePath;
				let token = this.instance.context.accessToken;
				let str = config.imAppKey.split("#");
				let domain = config.imApiUrl + "/";
				uni.uploadFile({
					url: domain + str[0] + "/" + str[1] + "/chatfiles",
					filePath: tempFilePaths,
					name: "file",
					header: {
						Authorization: "Bearer " + token
					},
					success: (res) => {
						console.log(res)
						let ext = this.setMessageExt()
						var data = res.data;
						var dataObj = JSON.parse(data);
						var option = {
							type: "video",
							chatType: "singleChat",
							filename: "filename",
							url: dataObj.uri + "/" + dataObj.entities[0].uuid,
							// 消息接收方：单聊为对方用户 ID，群聊和聊天室分别为群组 ID 和聊天室 ID。
							to: to,
							ext: ext,
							body: {
								//文件 URL。
								url: dataObj.uri + "/" + dataObj.entities[0].uuid,
								//文件类型。
								type: "video",
								//文件名称。
								filename: "filename",
							},
						};
						let msg = SDK.message.create(option);
						// 调用 `send` 方法发送该消息。
						this.instance
							.send(msg)
							.then((res) => {
								// 消息成功发送。
								callback && callback(res)
								uni.hideLoading()
							})
							.catch((e) => {
								// 消息发送失败。
								console.log("Fail视频");
								this.onError(e)
							});
					},
					fail: () => {
						uni.hideLoading()
					}
				})
			},
			fail: () => {
				uni.hideLoading()
			}
		})
	}
	//监听
	onError(err, callback ?: Function) {
		uni.hideLoading()
		callback && callback()
		console.log('监听错误', err)
		if (err.type == 39 || err.type == 206) {
			uni.showModal({
				content: 'im服务断开,尝试重新连接',
				confirmText: '确定',
				showCancel: false,
			}).then(() => {
				this.login().then((data) => {
					console.log('连接成功', data)
					if (data) {
						uni.showToast({
							mask: true,
							icon: "none",
							title: '连接成功'
						})
					}
				})
			})
		} else if (err.type == 1) {
			uni.showToast({
				mask: true,
				icon: "none",
				title: 'im服务连接失败'
			})
		}
	}
	listen(callback : Function) {
		this.instance.addEventHandler("eventName", {
			// SDK 与环信服务器连接成功。
			onConnected: function (message) {
				console.log("onConnected", message)
			},
			// SDK 与环信服务器断开连接。
			onDisconnected: (message) => {
				console.log("onDisconnected", message)
			},
			// 当前用户收到文本消息。
			onTextMessage: function (message) {
				console.log('监听文本', message)
				callback && callback({
					type: "onTextMessage",
					data: message
				})
			},
			// 当前用户收到图片消息。
			onImageMessage: function (message) {
				console.log('监听图片', message)
				callback && callback({
					type: "onImageMessage",
					data: message
				})
			},
			// 当前用户收到透传消息。
			onCmdMessage: function (message) { },
			// 当前用户收到语音消息。
			onAudioMessage: function (message) { },
			// 当前用户收到位置消息。
			onLocationMessage: function (message) { },
			// 当前用户收到文件消息。
			onFileMessage: function (message) { },
			// 当前用户收到自定义消息。
			onCustomMessage: function (message) { },
			// 当前用户收到视频消息。
			onVideoMessage: function (message) {
				console.log('监听视频', message)
				callback && callback({
					type: "onVideoMessage",
					data: message
				})
			},
			// 当前用户订阅的其他用户的在线状态更新。
			onPresence: function (message) {

			},
			// 当前用户收到好友邀请。
			onContactInvited: function (msg) { },
			// 联系人被删除。
			onContactDeleted: function (msg) { },
			// 新增联系人。
			onContactAdded: function (msg) { },
			// 当前用户发送的好友请求被拒绝。
			onContactRefuse: function (msg) { },
			// 当前用户发送的好友请求被同意。
			onContactAgreed: function (msg) { },
			// 当前用户收到群组邀请。
			onGroupEvent: function (message) { },
			// 本机网络连接成功。
			onOnline: function () { },
			// 本机网络掉线。
			onOffline: function () { },
			// 调用过程中出现错误。
			onError: (message) => {
				this.onError(message)
			},
			// 当前用户收到的消息被消息发送方撤回。
			onRecallMessage: function (message) { },
			// 当前用户发送的消息被接收方收到。
			onReceivedMessage: function (message) { },
			// 当前用户收到消息送达回执。
			onDeliveredMessage: function (message) { },
			// 当前用户收到消息已读回执。
			onReadMessage: function (message) { },
			// 当前用户收到会话已读回执。
			onChannelMessage: function (message) { },
		})
	}
	// pageSize: 每页期望获取的会话数量。取值范围为 [1,50]，默认为 `20`。
	// cursor：开始获取数据的游标位置。若传空字符串（''），SDK 从最新活跃的会话开始获取。
	getServerConversations(callback : Function) {
		this.instance.getServerConversations().then((res) => {
			console.log(res)
			callback && callback(res)
		}).catch((er) => {
			this.onError(er, () => {
				callback && callback({
					data: {
						conversations: [],
						cursor: ""
					}
				})
			})

		})
	}
	getHistoryMessages(callback : Function, params, errBack ?: Function) {
		let { targetId, cursor, chatType } = params
		let options = {
			// 对方的用户 ID 或者群组 ID 或聊天室 ID。
			targetId: targetId,
			// 每页期望获取的消息条数。取值范围为 [1,50]，默认值为 20。
			pageSize: 10,
			// 查询的起始消息 ID。若该参数设置为 `-1`、`null` 或空字符串，从最新消息开始。
			cursor: cursor,
			// 会话类型：（默认） `singleChat`：单聊；`groupChat`：群聊；`chatRoom`：聊天室
			chatType: chatType,
			// 消息搜索方向：（默认）`up`：按服务器收到消息的时间的逆序获取；`down`：按服务器收到消息的时间的正序获取。
			searchDirection: "up",
		};
		this.instance.getHistoryMessages(options).then((res) => {
			// 成功获取历史消息。
			callback && callback(res)
		}).catch((e) => {
			// 获取失败。
			this.onError(e)
			errBack && errBack(e)
		});

	}
	//获取用户在线状态-[用户id]
	getPresenceStatus(callback : Function, params) {
		this.instance.getPresenceStatus({
			usernames: params
		}).then((res) => {
			console.log(res)
			callback && callback(res)
		}).catch((er) => {
		})
	}
	setMessageExt() {
		let ext = {}
		ext['xjs_' + useUserStore().userInfo.id] = {
			username: useUserStore().userInfo.nickName,
			avatar: useUserStore().userInfo.avatar
		}
		ext['xjs_' + useUserStore().userfromInfo.id] = {
			username: useUserStore().userfromInfo.username,
			avatar: useUserStore().userfromInfo.avatar
		}
		return ext
	}
}

export const getcId = () => {
	// #ifdef APP
	return new Promise((resolve) => {
		// 此版本暂无推送配置-先注销
		resolve(false)
		// uni.getPushClientId({
		// 	success: (res) => {
		// 		console.log('客户端推送标识cid:', res.cid)
		// 		if (loginStatus()) {
		// 			api({
		// 				method: 'post',
		// 				url: `/mall/user/app-push-relation`,
		// 				data:{
		// 					userClientId:configs.beginning == 'user'?res.cid:'',
		// 					serviceClientId:configs.beginning == 'service'?res.cid:'',
		// 				}
		// 			}).then((res : any) => {
		// 				console.log(res)
		// 			})
		// 		}
		// 		resolve(res.cid)
		// 	},
		// 	fail(err) {
		// 		console.log(err)
		// 		resolve(false)
		// 	}
		// })
	})
	// #endif

}
export const uniPushIm = () => {
	// 此版本暂无推送配置-先注销
	// #ifdef APP
	// uni.onPushMessage((res : any) => {
	// 	console.log('推送', res)
	// 	// 监听通知栏消息的点击  
	// 	if (res.type == 'click') {
	// 		// 是否存在跳转路径
	// 		if (res.data.payload.path) {
	// 			// 不需要登录判断时 或者需要登录并且已登录时  才可执行
	// 			if (!res.data.payload.hasLogin || (res.data.payload.hasLogin && loginStatus())) {
	// 				clearTimeout(uniPushtimer);
	// 				var uniPushtimer = setTimeout(() => {
	// 					uni[res.data.payload.jumpType]({
	// 						url: res.data.payload.path
	// 					})

	// 				}, res.data.payload.time)
	// 			}
	// 		}
	// 	}
	// 	// 监听在线推送消息，若云函数设置了 "force_notification":true，则不会触发此 receive。  
	// 	if (res.type == 'receive') {
	// 		console.log("接收到的消息内容", res);
	// 	}
	// })
	// #endif

}